package com.example.online.music.common;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.Protocol;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class OSSUtil {

    // 阿里云 AccessKey ID
    private static final String ACCESSKEYID = "LTAI5t6pdb1hAuCEmfAiCLpU";
    // 阿里云 AccessKey Secret
    private static final String ACCESSKEYSECRET = "7mKYTF542oZypAmZ8El4GlMSgh0cZV";
    // OSS存储空间名称
    private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
    // OSS访问域名(外网)
    private static final String BUCKETNAME = "music-pro202306";

    /**
     * 获取OSSClient实例
     * @return
     */
    public static OSSClient createOSSClient() {
        CredentialsProvider credsProvider = new DefaultCredentialProvider(ACCESSKEYID, ACCESSKEYSECRET);
        ClientConfiguration config = new ClientConfiguration();
        config.setProtocol(Protocol.HTTPS);
        OSSClient client = new OSSClient(ENDPOINT, credsProvider, config);
        return client;
    }
    /**
     * 取文件的临时受权访问路径
     *
     * @param objectName
     * @return
     */
    public static String ossUrl(String objectName) throws UnsupportedEncodingException {
        // 创建OSSClient实例
        OSSClient ossClient = OSSUtil.createOSSClient();
        // 设置URL过期时间为2小时
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000 * 2);
        // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(BUCKETNAME, objectName, expiration);
        String decode = URLDecoder.decode(String.valueOf(url), "UTF-8");
        decode = decode.replaceAll("\\+", "%2b");
        // 关闭OSSClient
        ossClient.shutdown();
        return decode;
    }

    public static String getBase64ByUrl(String fileUrl) {
        String base64String = "";
        try {
            //new一个URL对象
            URL url = new URL(fileUrl);
            //打开链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            //得到图片的二进制数据，以二进制封装得到数据，具有通用性
            byte[] data = readInputStream(inStream);
            BASE64Encoder encode = new BASE64Encoder();
            base64String = encode.encode(data);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return base64String;
    }

    private static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度，如果为-1，代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }


    public static void main(String[] args) {
        try {
            String base64Str = getBase64ByUrl(ossUrl("img/songListPic/a.jpg"));
            System.out.println("******* start *****");
            System.out.println("base64 : " + base64Str.substring(0,100));
            System.out.println("******* end *****");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}
